from random import randint
from utils.response_code import RETCODE
from django.http import *
# 导入redis包
from django_redis import get_redis_connection
from django.shortcuts import *
from django.views import View
  #导入图片验证码库
from libs.captcha.captcha import captcha
# Create your views here.
# 短信验证码
from libs.yuntongxun.sms import CCP
import re
from django.contrib.auth import *
from users.models import User
# 注册
class RegisterView(View):
    # 注册页面展示
    def get(self,request):
        return render(request,'register.html')
    def post(self,request):
        # 1接受用户信息
        mobile=request.POST.get("mobile")
        password=request.POST.get("password")
        password2=request.POST.get("password2")
        sms_code=request.POST.get("sms_code")
        # 2验证数据
        # 参数是否齐全
        if not all([mobile,password,password2,sms_code]):
            return HttpResponseBadRequest("参数不全")
        # # 手机格式是否正确
        if not re.match(r'^1[3-9]\d{9}$',mobile):
            return HttpResponseBadRequest("手机号码格式不正确")
        # # 密码是否符合
        if not re.match(r'^[0-9a-zA-Z]{8,20}$', password) or not re.match(r'^[0-9a-zA-Z]{8,20}$', password2):
            return HttpResponseBadRequest('密码长度、格式不正确。长度8-20，必须是数字、字母')
        #     # 2-4、密码和确认密码是否一致
        if password != password2:
            return HttpResponseBadRequest('两次输入的密码不一致')
        redis_conn=get_redis_connection()
        redis_sms_code=redis_conn.get('sms:%s' % mobile)
        if redis_sms_code.decode()!=sms_code:
            return HttpResponseBadRequest("短信验证码错误")
        # 保存注册信息
        user=User.objects.create_user(username=mobile,mobile=mobile,password=password)
        login(request,user)
        resp=redirect(reverse('home:index'))
        resp.set_cookie('is_login',True)
        resp.set_cookie('login_name',user.username)
        return resp

# 图片验证码
class ImageView(View):
    def get(self,request):
        '''
                       步骤：
                       1、接收前端传递过来的uuid
                       2、判断uuid失分获取到
                       3、通过调用captcha来生成图片验证码（返回：图片内容和图片二进制）
                       4、将图片内容保存到redis中。uuid作为key，图片内容作为值，同时还需要设置一个过期时间
                       5、返回图片给前端
                       :param request:
                       :return:
               '''
        uuid = request.GET.get('uuid')
        if uuid is None:
            return HttpResponseBadRequest("uuid不存在")
        txt,image =captcha.generate_captcha()
        redis_conn = get_redis_connection('default')
        redis_conn.setex(name='img:%s' % uuid, time=300,value=txt)
        # 返回图片给前端
        return HttpResponse(image,content_type='image/jpeg')

# 发送短信验证码视图
class SmsCodeView(View):
    def get(self, request):
        # 接收参数
        mobile = request.GET.get("mobile")
        image_code = request.GET.get("image_code")
        uuid = request.GET.get("uuid")
        # 参数校验
        # 判断参数是否齐全
        if not all([mobile,image_code,uuid]):
            return JsonResponse({'code':RETCODE.NECESSARYPARAMERR,"errmag":'参数不全'})
        # 图片验证码的验证
        redis_conn=get_redis_connection()
        # 从redis中获取已经存入的图片验证码信息
        image_code_redis=redis_conn.get('img:%s' % uuid)
        if image_code_redis is None:
            return JsonResponse({'code':RETCODE.IMAGECODEERR,"errmag":'图片验证码不存在'})
        # 删除redis中已经验证的图片验证码
        redis_conn.delete('img:%s' % uuid)
        # redis中取出的数据需要decode()进行解码,都转化为小写
        if image_code.lower()!=image_code_redis.decode().lower():
            return JsonResponse({'code':RETCODE.IMAGECODEERR,"errmag":'图片验证码错误'})
        # 生成短信验证码：生成六位随机数验证码
        sms_code = '%06d' % randint(0,999999)
        ccp = CCP()
        ccp.send_template_sms('17392927956', [sms_code, 5], 1)
        print(f'你的验证码是:{sms_code}')
        redis_conn.setex('sms:%s' % mobile,60,sms_code)
        return  JsonResponse({'code':RETCODE.OK,"errmag":'短信发送成功'})

# 登录视图
class LoginView(View):
    def get(self,req):
        return render(req,'login.html')
    def post(self,req):
        '''
            实现思路：
            1、接收提交参数
            2、验证参数
             2-1、手机号码是否符合规则
             2-2、密码是否符合规则
            3、用户认证登录
            4、状态保持
            5、根据用户选择的是否记住登录状态进行判断
            6、设置cookie信息，为首页显示服务
            7、跳转到首页
            :param request:
            :return:
        '''
        # 1、接收提交参数
        mobile = req.POST.get('mobile')
        password = req.POST.get('password')
        remember = req.POST.get('remember')
        # 2、验证参数
        if not all([mobile,password]):
            return HttpResponseBadRequest("缺少必要参数")
        # 2 - 1、手机号码是否符合规则
        if not re.match(r'^1[3-9]\d{9}$',mobile):
            return HttpResponseBadRequest("手机号码格式不正确")
        # 2 - 2、密码是否符合规则
        if not re.match(r'^[0-9A-Za-z]{8,20}$',password):
            return HttpResponseBadRequest("密码格式不正确")
        # 3、用户认证登录
        return_user = authenticate(mobile=mobile,password=password)
        if return_user is None:
            return HttpResponseBadRequest("用户名或密码错误")
        # 4、状态保持
        login(req,return_user)
        # 5、根据用户选择的是否记住登录状态进行判断
        # 6、设置cookie信息，为首页显示服务
        resp = redirect(reverse('home:index'))
        if remember != 'on':
            req.session.set_expiry(0)
            resp.set_cookie('is_login',True)
            resp.set_cookie('login_name',return_user.username)
        else:
            req.session.set_expiry(None)
            resp.set_cookie('is_login',True,max_age=14 * 24 * 3600)
            resp.set_cookie('login_name',return_user.username,max_age=14 * 24 * 3600)
        return resp
